package Segmentacao;

import javax.media.jai.PlanarImage;
import Controle.ManipularImagem;
import Estruturas.HistoricoImagem;

public class Rotularizacao {

//    public static PlanarImage rotularizar (PlanarImage imagem) {
//
//        // Binariza a imagem...
//        PlanarImage imagemBinarizada = ManipularImagem.binarizarImagem(imagem);
//
//        // Aqui vc comeca o codigo da rotulacao, usando a variavel 'imagemBinarizada'...
//
//        return imagemBinarizada;
//    }
    public static PlanarImage rotularizar(PlanarImage imagem) {
        PlanarImage imagemBinarizada = ManipularImagem.binarizarImagem(imagem, 90);

        int contV, central, lateralEsquerda, lateralDireita, inferior, superior;//contador altura
        int contH, rotulo[][] = null, valorRotulo;//contador largura
        int altura = imagemBinarizada.getHeight();
        int largura = imagemBinarizada.getWidth();

        int[][] matriz = new int[altura][largura];
        matriz = Controle.ManipularImagem.planarToMatriz(imagemBinarizada);

        int contRotulo = 0;
        for (contV = 1; contV <= altura; contV++) {
            for (contH = 1; contH <= largura; contH++) {
                central = (int) matriz[contV][contH]; //pega o valor do pixel
                lateralEsquerda = (int) matriz[contV][contH - 1];
                superior = (int) matriz[contV - 1][contH];
                lateralDireita = (int) matriz[contV][contH + 1];
                inferior = (int) matriz[contV + 1][contH];
                //int rotuloCentral=rotulo[contV][contH];
                int rotuloEsquerda = rotulo[contV][contH - 1];//manipulação com os rotulos
                int rotuloSuperior = rotulo[contV - 1][contH];
                int rotuloDireita = rotulo[contV][contH + 1];
                int rotuloInferior = rotulo[contV + 1][contH];
                //como fazer que os rotulos iniciem em zero
                if (central == 1) {
                    if (lateralEsquerda == 0 && superior == 0 && lateralDireita == 0 && inferior == 0) {
                        rotulo[contV][contH] = contRotulo;
                        contRotulo++;
                    }//se os vizinhos são iguais a 0 atribui um rotulo ao pixel
                    else {
                        if (lateralEsquerda == 1) {
                            if (rotuloEsquerda != 0) {
                                rotulo[contV][contH] = rotuloEsquerda;
                            } else {
                                rotuloEsquerda = contRotulo + 1;
                                rotulo[contV][contH] = rotuloEsquerda;
                                contRotulo++;
                            }
                        }
                        if (superior == 1) {
                            if (rotuloSuperior != 0) {//1
                                if (rotulo[contV][contH] != 0) {
                                    //colocar o rotulo em uma tabela de equivaalencia
                                } else {
                                    rotulo[contV][contH] = rotuloSuperior;
                                }
                            } else {
                                rotuloSuperior = contRotulo + 1;
                                rotulo[contV][contH] = rotuloSuperior;
                                contRotulo++;
                            }
                        }
                        if (lateralDireita == 1) {
                            if (rotuloDireita != 0) {//1
                                if (rotulo[contV][contH] != 0) {
                                    //colocar o rotulo em uma tabela de equivaalencia
                                } else {
                                    rotulo[contV][contH] = rotuloDireita;
                                }
                            }//fim do 1
                            else {
                                rotuloDireita = contRotulo + 1;
                                rotulo[contV][contH] = rotuloSuperior;
                                contRotulo++;
                            }
                        }
                        if (inferior == 1) {
                            if (rotuloInferior != 0) {//1
                                if (rotulo[contV][contH] != 0) {
                                    //colocar o rotulo em uma tabela de equivaalencia
                                } else {
                                    rotulo[contV][contH] = rotuloInferior;
                                }
                            } else {
                                rotuloInferior = contRotulo + 1;
                                rotulo[contV][contH] = rotuloInferior;
                                contRotulo++;
                            }
                        }
                    }
                }
            }
        }
        PlanarImage imagemFinal = Controle.ManipularImagem.matrizToPlanar(matriz, altura, largura, imagem);
        return imagemFinal;

    }
}

